B-spline Curves

Bezier curve

贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式。但直到 1959 年,当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试,并提出了一种数值稳定的 de Casteljau 算法。然而贝塞尔曲线的得名,却是由于 1962 年另一位就职于雷诺的法国工程师 Pierre Bézier 的广泛宣传。他使用这种只需要很少的控制点就能够生成复杂平滑曲线的方法,来辅助汽车车体的工业设计。

正是因为控制简便却具有极强的描述能力,贝塞尔曲线在工业设计领域迅速得到了广泛的应用。不仅如此,在计算机图形学领域,尤其是矢量图形学,贝塞尔曲线也占有重要的地位。今天我们最常见的一些矢量绘图软件,如 Flash、Illustrator、CorelDraw 等,无一例外都提供了绘制贝塞尔曲线的功能。甚至像 Photoshop 这样的位图编辑软件,也把贝塞尔曲线作为仅有的矢量绘制工具(钢笔工具)包含其中。

Bezier曲线由一组控制点$P_0$到$P_n$定义,其中n称为其阶(n = 1表示线性,2表示二次,等等)。第一个控制点和最后一个控制点始终是曲线的端点;然而,中间控制点(如果有的话)通常不在曲线上。

一阶贝塞尔曲线(Linear Bezier curves)

给定控制点$P_0$和$P_1$, 线性贝塞尔曲线是两点中的线段。

二阶贝塞尔曲线(Quadratic Bezier curves)

给定三个控制点$P_0 \ P_1$和$P_2$, 取$S_0$为直线$P_0 P_1$一阶贝塞尔曲线,$S_1$为$P_1 P_2$一阶贝塞尔曲线,得:

可推导出一阶导数为:

由此可见,二阶贝塞尔曲线在$P_0$和$P_2$处的切线相交于$P_1$。

可推导出二阶导数为:

三阶贝塞尔曲线(Cubic Bezier curves)

给定四个控制点$P_0 \ P_1 \ P_2$和$P_3$,由以上推导,三阶贝塞尔曲线可以由二阶导出:

展开可得:

可推导出一阶导数为:

可推导出二阶导数为:

N阶通用形式

其导数为:

其中$b_{i,n}$称为Bernstein polynomial,$P_i$称为贝塞尔曲线控制点,由控制点组成的多边形为贝塞尔多边形,并且此多边形为贝塞尔曲线的凸包(convex hull)。

贝塞尔曲线性质

  • 曲线从$P_0$开始,到$P_n$结束,称为端点插值性质。
  • 当且仅当所有控制点共线时,曲线是一条直线。
  • 曲线的起点和终点分别与贝塞尔多边形的第一段和最后一段相切。
  • 一条曲线可以在任意点上分成两条子曲线,也可以分成任意多条子曲线,每条子曲线都是贝塞尔曲线。
  • 有些曲线看起来很简单,比如圆,不能用Bezier曲线或分段Bezier曲线精确地描述。
  • 每条二次贝塞尔曲线也是一条三次贝塞尔曲线,更一般的,每一条n阶贝塞尔曲线也是一条m阶贝塞尔曲线,其中m > n。比如n阶贝塞尔曲线具有控制点$P_0, \cdots, P_n$也是n+1阶贝塞尔曲线,其中$P_k^{\prime} = \frac{k}{n + 1}P_{k-1} + (1+\frac{k}{n+1})P_k$
  • 贝塞尔曲线具有变异递减性质。从直观的角度来看,这意味着一条Bezier曲线的“波动”不会超过它的控制点的多边形,而实际上它的“波动”可能比控制点的多边形还要小.
  • 对于某些控制点的选择,大于2阶的贝塞尔曲线可能会与自身相交,也可能有一个尖顶。

Reference

[1] https://en.wikipedia.org/wiki/Bézier_curve
[2] https://www.desmos.com/calculator/xlpbe9bgll